package com.fsh.subject.common.context;


import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 作者：fsh
 * 日期：2023/11/30
 * <p>
 * 描述：刷题服务的 上下文
 */
public class SubjectContextHolder {

    /**
     * 声明一个私有的静态最终变量THREAD_LOCAL，类型为InheritableThreadLocal<Map<String, Object>>
     * 这里用map是因为，要存更多东西，不仅仅是loginId
     * InheritableThreadLocal是线程局部变量的一个实现，它可以创建线程局部变量的子类并将其值继承给新线程
     */
    private static InheritableThreadLocal<Map<String,Object>> THREAD_LOCAL
            =new InheritableThreadLocal<>();

    /**
     * // 声明一个公共的静态方法getThreadLocalMap，该方法返回当前线程的线程局部变量map.
     * // 如果不存在则创建一个新的ConcurrentHashMap并设置为当前线程的线程局部变量
     */
    public static Map<String,Object> getThreadLocalMap(){
        // 获取当前线程的线程局部变量map
        Map<String, Object> map = THREAD_LOCAL.get();
        // 如果map为空，则创建一个新的ConcurrentHashMap并设置为当前线程的线程局部变量
        if(Objects.isNull(map)){
            map=new ConcurrentHashMap<>();
            THREAD_LOCAL.set(map);
        }
        // 返回当前线程的线程局部变量map
        return map;
    }

    /**
     * 声明一个公共的静态方法set。
     * 该方法接受两个参数：key和val，并将key-val对存储到线程局部变量中
     */
    public static void set(String key,Object val){
        // 获取线程局部变量map
        Map<String, Object> map = getThreadLocalMap();
        // 将key-val对存储到map中
        map.put(key,val);
    }

    /**
     * 声明一个公共的静态方法get。
     * 该方法接受一个参数：key，并返回存储在线程局部变量中的与key对应的值
     */
    public static Object get(String key){
        // 获取线程局部变量map
        Map<String, Object> map= getThreadLocalMap();
        // 返回存储在map中与key对应的值
        return map.get(key);
    }


    /**
     * 声明一个公共的静态方法remove，该方法清除存储在线程局部变量中的所有数据
     */
    public static void remove() {
        THREAD_LOCAL.remove();
    }
}
